package com.zhixi.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.zhixi.common.R;
import com.zhixi.pojo.User;
import com.zhixi.service.UserService;
import com.zhixi.mapper.UserMapper;
import com.zhixi.utils.SendSmsUtils;
import com.zhixi.utils.ValidateCodeUtils;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import javax.servlet.http.HttpSession;
import java.util.concurrent.TimeUnit;

/**
 * @author zhangzhixi
 * @description 针对表【user(用户信息)】的数据库操作Service实现
 * @createDate 2022-07-13 22:06:23
 */
@Service
@Slf4j
public class UserServiceImpl extends ServiceImpl<UserMapper, User>
        implements UserService {

    @Autowired
    private RedisTemplate<String, Object> redisTemplate;

    @Value("${tencent.sms.appid}")
    private String appId;

    @Value("${tencent.sms.templateid}")
    private String templateId;

    /**
     * 访问秘钥(相当于使用该短信服务的用户)
     */
    @Value("${tencent.sms.secretId}")
    private String secretId;

    @Value("${tencent.sms.secretKey}")
    private String secretKey;

    @Override
    public R<String> senMsg(User user, HttpSession session) {
        //获取手机号
        String phone = user.getPhone();

        if (StringUtils.isNotEmpty(phone)) {
            //生成随机的4位验证码
            String code = String.valueOf(ValidateCodeUtils.generateValidateCode(4));
            log.info("生成的手机验证码是：{}", code);

            //调用腾讯云提供的短信服务API完成短信发送(可以正常发送)
            //SendSmsUtils.sendSms(appId, templateId, phone, code, secretId, secretKey);

            //需要将生成的验证码保存到session
//            session.setAttribute(phone, code);

            //将生成的验证码保存到redis中
            redisTemplate.opsForValue().set(phone, code, 5, TimeUnit.MINUTES);
            return R.success("短信发送成功");
        }
        return R.error("短信发送失败");
    }

    @Override
    public R<User> login(User user, HttpSession session) {
        log.info(user.toString());
        // 1、获取手机号
        String phone = user.getPhone();
        // 2、获取验证码
        String code = user.getCode();
        // 3、从session中获取保存的验证码
        // String codeInSession = session.getAttribute(phone).toString();

        // 3、使用redisTemplate获取验证码
        String codeInSession = redisTemplate.opsForValue().get(phone).toString();

        // 4、进行验证码的对比（页面提交的验证码和session中保存的验证码）
        if (code != null && code.equals(codeInSession)) {
            // 4.1、如果比对成功，则登录成功，查询该用户是否存在
            LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
            queryWrapper.eq(User::getPhone, phone);
            User userToQuery = this.getOne(queryWrapper);

            // 4.2、判断当前手机号是否为新用户，如果是新用户则自动完成注入
            if (userToQuery == null) {
                userToQuery = new User();
                userToQuery.setPhone(phone);
                this.save(userToQuery);
            }

            // 5、登录成功，将用户信息保存到session中
            session.setAttribute("user", userToQuery.getId());

            // 6、登录成功删除redis中的验证码
            redisTemplate.delete(phone);

            return R.success(userToQuery);
        }
        return R.error("登录失败，验证码错误");
    }
}




